package net.schastny.shopmanager.web;
import java.util.HashMap;
import java.util.Map;

import javax.validation.Valid;

import net.schastny.shopmanager.additional.Dictionary;
import net.schastny.shopmanager.domain.BaseOrder;
import net.schastny.shopmanager.domain.Contact;
import net.schastny.shopmanager.domain.PreOrder;
import net.schastny.shopmanager.service.ContactService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

/*	Controller - Аннотация используется для магического превращения любого java класса в класс контроллера. 
 * Данный класс представляет собой компонент, похожий на обычный сервлет (HttpServlet) (работающий с 
 * объектами HttpServletRequest и HttpServletResponse), но с расширенными возможностями по применению в MVC-приложениях.
 */
@Controller
public class ContactController {
	@Autowired
    private ContactService contactService;

	/*RequestMapping - Аннотация используется для маппинга урл-адреса запроса на указанный метод или класс. 
	 * Запрос можно маппить как на метод класса, так и на целый класс.
	 *  Допускается указывать конкретный HTTP-метод, который будет обрабатываться (GET/POST), 
	 *  передавать параметры запроса.
	 */
	@RequestMapping("/newContact")
    public String listContacts(Map<String, Object> map) {
		System.out.println("It's listContacts");
        map.put("contact", new Contact());
        map.put("contactList", contactService.listContact());
        map.put("warehouseList", Dictionary.getDictionary().get("warehouses"));

        return "contactadd";
    }
	

	/*ModelAttribute - Аннотация, связывающая параметр метода или возвращаемое значение метода с атрибутом модели,
	 *  которая будет использоваться при выводе jsp-страницы.
	 */
	@RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addContact(@ModelAttribute("contact") @Valid Contact contact,
            BindingResult result) {
		System.out.println("It's addContact");		
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		String name = auth.getName();
		contact.setContactCreatedUser(name);
        contactService.addContact(contact);
		if (result.hasErrors()) {
			return "contactadd";
		} else {
			 return "redirect:/index";
		}
       
    }
	/*PathVariable - Аннотация, которая показывает, что параметр метода должен быть связан с переменной из урл-адреса. 
	 */
	@RequestMapping("/deleteContact/{contactId}")
    public String deleteContact(@PathVariable("contactId") Integer contactId) {
		System.out.println("********* DELETE ************" + contactId);
        contactService.removeContact(contactId);

        return "redirect:/index";
    }	
	
	
    /**
     * Retrieves the "Edit Existing Record" page
     */
	
   @RequestMapping(value = "/editContact/{contactId}", method = RequestMethod.GET)
    public String getEdit(@PathVariable("contactId") Integer contactId, Model model) {
		System.out.println("It's editContact");	
    	//get existing BaseOrder
    	Contact existingContact = contactService.getContact(contactId);
    	// Add existing BaseOrder to model
    	model.addAttribute("contact", existingContact);
    	model.addAttribute("warehouseList", Dictionary.getDictionary().get("warehouses"));
        
    	return "contactadd";
	}
 
    /**
     * Edits an existing record
     */
   @RequestMapping(value = "/editContact/{contactId}", method = RequestMethod.POST)
   public String postEdit(@PathVariable("contactId") Integer contactId, 
   						    @ModelAttribute("contact")  @Valid Contact contact,
   				            BindingResult result) {
	   System.out.println("");
		// Assign id
    	contact.setContactId(contactId);		
		// Delegate to service
    	contactService.editContact(contact);
    	System.out.println("--- Error = "+result.getFieldError());
		if (result.hasErrors()) {
			return "contactadd";
		} else {
			 return "redirect:/index";
		}	

	
	}
    

}
